home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / glibc108.zip / glibc108 / hurd / preempt-sig.c < prev    next >
C/C++ Source or Header  |  1994-04-27  |  2KB  |  69 lines

  1. /* Copyright (C) 1994 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. #include <hurd/signal.h>
  20.  
  21. /* Initialize PREEMPTER with the information given and stick it in the
  22.    chain of preempters for SIGNO.  */
  23.  
  24. int
  25. hurd_preempt_signals (struct hurd_signal_preempt *preempter,
  26.               int signo, int first_code, int last_code,
  27.               sighandler_t (*handler) (thread_t, int, int))
  28. {
  29.   if (signo <= 0 || signo >= NSIG)
  30.     {
  31.       errno = EINVAL;
  32.       return -1;
  33.     }
  34.   preempter->first = first_code;
  35.   preempter->last = last_code;
  36.   preempter->handler = handler;
  37.   __mutex_lock (&_hurd_signal_preempt_lock);
  38.   preempter->next = _hurd_signal_preempt[signo];
  39.   _hurd_signal_preempt[signo] = preempter;
  40.   __mutex_unlock (&_hurd_signal_preempt_lock);
  41.   return 0;
  42. }
  43.  
  44. /* Remove PREEMPTER from the chain for SIGNO.  */
  45.  
  46. int
  47. hurd_unpreempt_signals (struct hurd_signal_preempt *preempter, int signo)
  48. {
  49.   struct hurd_signal_preempt *p, *lastp;
  50.   if (signo <= 0 || signo >= NSIG)
  51.     {
  52.       errno = EINVAL;
  53.       return -1;
  54.     }
  55.   __mutex_lock (&_hurd_signal_preempt_lock);
  56.   for (p = _hurd_signal_preempt[signo], lastp = NULL;
  57.        p != NULL; lastp = p, p = p->next)
  58.     if (p == preempter)
  59.       {
  60.     (lastp == NULL ? _hurd_signal_preempt[signo] : lastp->next) = p->next;
  61.     __mutex_unlock (&_hurd_signal_preempt_lock);
  62.     return 0;
  63.       }
  64.   _hurd_signal_preempt[signo] = preempter;
  65.   __mutex_unlock (&_hurd_signal_preempt_lock);
  66.   errno = ENOENT;
  67.   return -1;
  68. }
  69.